昨天透過 GitLab CI 成功自動化編譯多架構 Docker Image 後,接下來就要實際部署上 Kubernetes 來進行管理啦
Kubernetes 是一用於「自動部署、擴充和管理容器化應用程式」的開源系統,其旨在提供「跨主機叢集的自動部署、擴充以及執行應用程式容器的平台」,於 2014 年由 Google 公布,並於隔年 2015 年正式推出 v1.0,並捐贈給 CNCF (Cloud Native Computing Foundation)
下圖為 Kubernetes 架構圖,主要分為兩大部分
▲ 圖取自 Kubernetes Documentation
這邊我們會透過由 Google 釋出的本地 Kubernetes 叢集環境 minikube,在本地快速建立 Kubernetes 叢集環境
minikube 官網提供了 Linux、macOS、Windows 這三套系統的安裝方式
這裡我們的環境為 macOS,M1 為 ARM64 架構的
所以我們就選擇「macOS、ARM64」,版本就選擇「Stable」穩定版本、安裝方式,個人習慣使用 Homebrew,所以就選擇「Homebrew」
開啟 Terminal,輸入官網上的 Homebrew 安裝指令
brew install minikube
安裝好之後,就可以來啟動 minikube 啦
minikube start
安裝完 Kubernetes 叢集環境後,就要來撰寫各個 Kubernetes 元件了 (Ex:Pod、Deployment、Service 等)
# Kubernetes 中 Deployment 元件的版本
apiVersion: apps/v1
# 該元件的類型
kind: Deployment
# 該元件的元資料
metadata:
# 這個 Deployment 的名稱
name: it15th-deployment
# 這個 Deployment 的 DeploymentSpec
spec:
# 要建立的 Pod 數量
# 當現有 Pod 數量小於這邊 replica 設定的數值時,就會自動產生對應數量的 Pod 來補齊
replicas: 2
# 將更新 Pod 取代舊有 Pod 的政策/策略
strategy:
# 這邊的 type 可以設定為 RollingUpdate 或 Recreate
# RollingUpdate 會逐一更新 Pod,不會將所有 Pod 都停止
# Recreate 會將所有 Pod 都停止,再重新建立新的 Pod
type: RollingUpdate
# 這邊的 maxSurge 設定為 1,表示在更新 Pod 時,最多可以多出 1 個 Pod
# 這邊的 maxUnavailable 設定為 0,表示在更新 Pod 時,最多可以少 0 個 Pod
rollingUpdate:
# 在 RollingUpdate 過程中,要多比 `replica` 設定的數量生幾個 Pod 出來
# 好處是,可以降低在 RollingUpdate 過程中,舊 Pod 內容出現的機率
maxSurge: 2
# 在 RollingUpdate 過程中,可以允許多少數量的 Pod 無法使用
# 若 maxSurge 不為 0,maxUnavailable 也不得為 0
maxUnavailable: 2
# 新建立出來的 Pod 如果沒有任何 Container Crash 的情形發生,
# 應準備就緒的最小秒數,預設為 0 (即 Pod 準備就緒後就可視為可用)
minReadySeconds: 60
# 要保留多少數量可以 RollBack 的舊有 ReplicaSet,預設為 10
revisionHistoryLimit: 10
# 要選取的 Pod
selector:
matchLabels:
app: it15th-pod
# 選到的 Pod 的 PodTemplateSpec
template:
# Pod 的元資料
metadata:
# Pod 的標籤
labels:
app: it15th-pod
# 選取到的 Pod 的 PodSpec,用來定義 Pod 中的 Containers
spec:
# Pod 要執行的 Container
containers:
# 選取到的 Pod 內的 Container 名稱
- name: it15th-container
# 這個 Container 要用的 Image,預設從 DockerHub 取得
image: leoho0722/it15th:k8s
# 宣告這個 Container 要對外開放的 port 類型
ports:
# 宣告這個 Container 要對外開放的 port 號
- containerPort: 8080
# 宣告這個 Container 要執行的指令
args: ["./it15th"]
# 宣告這個 Container 要用的資源
resources:
# 這個 Container 最多可以用到的資源
limits:
cpu: 200m
memory: 256Mi
# 這個 Container 最少要用到的資源
requests:
cpu: 100m
memory: 128Mi
# 宣告這個 Container 要用的 Volume
volumeMounts:
- name: it15th-pv
mountPath: /mnt/data
volumes:
- name: it15th-pv
persistentVolumeClaim:
claimName: it15th-pvc
# Kubernetes 中 Service 元件的版本號
apiVersion: v1
# 該元件的種類
kind: Service
# 該元件的元資料
metadata:
# 這個 Service 的名稱
name: it15th-service
# 這個 Service 的 ServiceSpec
spec:
# Service 要以哪種模式運作
# Kubernetes 提供 ClusterIP、NodePort、ExternalName、LoadBalancer
# 預設為 ClusterIP
type: NodePort
# 要選取的 Pod
selector:
app: it15th-pod
# 設定 Service 要連接的相關 port 號
ports:
- name: it15th-container
# 決定要以哪種網路協議來進行連線,TCP、UDP、SCTP
# 預設為 TCP
protocol: TCP
# Service 要用哪個 port 號來連到 Pod
# 通常 port 會跟 targetPort 設定為相同的 port 號
port: 8080
# Pod 對外開放的 port 號
# 沒設定 targetPort 的話,Kubernetes 預設會設為與 port 相同的 port 號
targetPort: 8080
# 指定外部連進 Service 的 port 號,範圍為 30000~32767
# 沒設定 nodePort 的話,Kubernetes 會自動指派一個範圍內的 port 號作為 nodePort
nodePort: 32000
# Kubernetes 中 PersistentVolumeClaim 元件的版本號
apiVersion: v1
# 該元件的種類
kind: PersistentVolumeClaim
# 該元件的元資料
metadata:
# 這個 PersistentVolumeClaim 的名稱
name: it15th-pvc
# 這個 PersistentVolumeClaim 的 PersistentVolumeClaimSpec
spec:
# 要求的儲存空間大小
resources:
requests:
storage: 256Mi
# 要求的儲存空間的卷模式
volumeMode: Filesystem
# 要求的儲存空間的存取模式
accessModes:
- ReadWriteOnce
# 要求的儲存空間的儲存類型
storageClassName: it15th-pv
# Kubernetes 中 PersistentVolume 元件的版本號
apiVersion: v1
# 該元件的種類
kind: PersistentVolume
# 該元件的元資料
metadata:
# 這個 PersistentVolume 的名稱
name: it15th-pv
# 這個 PersistentVolume 的 PersistentVolumeSpec
spec:
# 該 PersistentVolume 的容量大小
capacity:
# 該 PersistentVolume 的容量大小單位
storage: 1Gi
# 該 PersistentVolume 的卷模式
volumeMode: Filesystem
# 該 PersistentVolume 的存取模式
accessModes:
- ReadWriteOnce
# 該 PersistentVolume 的儲存類型
# 若不指定,則預設為 default 儲存類型
storageClassName: it15th-pv
# 該 PersistentVolume 位於主機上的儲存路徑
# 僅供單節點的 Kubernetes Cluster 使用
hostPath:
# 該 PersistentVolume 的儲存路徑
path: /mnt/data
# 該 PersistentVolume 的儲存路徑的類型
type: DirectoryOrCreate
上面我們寫好了要使用的 Kubernetes 元件的 yaml 檔,接下來就要實際部署到 Kubernetes 中了
透過 kubectl apply
來將各元件的 yaml 描述檔安裝到 Kubernetes 中
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl apply -f pv.yaml
kubectl apply -f pvc.yaml
接著,我們就可以透過 kubectl get all
來查看我們剛剛部署的各元件是否正常運作啦
看起來都有正常運作,那麼我們就可以透過 minikube service <service name>
來啟動
實際用 Postman 來試試看,看有沒有通
很好,都有正常運作!
今天我們將前面使用 Go 開發的 Web Backend API 透過 Docker 編譯後,變成容器化應用程式,並且部署到 Kubernetes 上
但在部署的過程中,我們需要手動部署多個元件,這部分我們在明天會來透過 Helm 著手改善
那麼我們明天見~